/*
 * Copyright (C) 2003 Erik Swenson - erik@oreports.com
 * 
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License as published by the Free
 * Software Foundation; either version 2 of the License, or (at your option)
 * any later version.
 * 
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
 * more details.
 * 
 * You should have received a copy of the GNU General Public License along with
 * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
 * Place - Suite 330, Boston, MA 02111-1307, USA.
 *  
 */

package org.efs.openreports.actions.image;

import java.io.IOException;
import java.util.Map;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;

import org.apache.log4j.Logger;

/**
 * This action is used to return images for HTML pages generated
 * by the JasperReports HTML export process. 
 * 
 * Each image generated by the export process is placed in the 
 * session scoped IMAGES_MAP. The generated HTML page calls this 
 * action to retreive the image from the map.
 * 
 * Another possible solution is to output images generated by the
 * export to a directory and have the HTML page refer to the directory.
 * This could cause a problem with multiple users because the image names
 * generated are not unique.
 * 
 * Both solutions are not ideal and are the result of the JasperReports
 * HTML export process. Rewriting the export to only generate dynamic
 * images and not images already available as files would probably speed 
 * up the process but is not possible with the current api.
 * 
 */

public class ImageLoaderAction extends ActionSupport
{	
	private static final long serialVersionUID = -3666965473175085098L;

	protected static Logger log = Logger.getLogger(ImageLoaderAction.class);

	private String imageName;

	public String execute()
	{
		Map imagesMap = (Map) ActionContext.getContext().getSession().get("IMAGES_MAP");

		if (imagesMap != null)
		{
			if (imageName != null)
			{
				byte[] imageData = (byte[]) imagesMap.get(imageName);

				HttpServletResponse response =
					ServletActionContext.getResponse();

				try
				{
					response.setContentLength(imageData.length);
					ServletOutputStream ouputStream = response.getOutputStream();
					ouputStream.write(imageData, 0, imageData.length);
					ouputStream.flush();
					ouputStream.close();
				}
				catch(IOException ioe)
				{
					log.warn(ioe.toString());
				}
			}
		}

		return NONE;
	}

	public String getImageName()
	{
		return imageName;
	}

	public void setImageName(String imageName)
	{
		this.imageName = imageName;
	}

}